package com.ecommerce.dddmodules.mainapp;

import com.ecommerce.dddmodules.ordercontext.model.CustomerOrder;
import com.ecommerce.dddmodules.ordercontext.model.OrderItem;
import com.ecommerce.dddmodules.ordercontext.repository.CustomerOrderRepository;
import com.ecommerce.dddmodules.ordercontext.service.OrderService;
import com.ecommerce.dddmodules.sharedkernel.events.EventBus;
import com.ecommerce.dddmodules.shippingcontext.repository.ShippingOrderRepository;
import com.ecommerce.dddmodules.shippingcontext.service.ShippingService;

import java.util.*;
/**
 * @packageName: mainapp（主应用包）
 * @className: Application(服务启动入口)
 * @description: 启动整个应用
 * @author: luds
 * @version: v1.0
 * @date: 2021-04/01
 */
public class Application {

	/**
	 * 服务启动入口
	 * @param args
	 */
	public static void main(String args[]) {
		// 创建需用的容器
		Map<Class<?>, Object> container = createContainer();

		// 从容器中获取订单服务
		OrderService orderService = (OrderService) container.get(OrderService.class);

		// 从容器中获取发货服务
		ShippingService shippingService = (ShippingService) container.get(ShippingService.class);

		// 发货服务监听订购事件
		shippingService.listenToOrderEvents();

		// 模拟演示一个客户订单
		CustomerOrder customerOrder = new CustomerOrder();

		/**
		 * 此客户订单：订单号为1，订单项目明细分别为如下：
		 * - 产品ID：1，数量：2，单价：3,单位重量：1
		 * - 产品ID：2，数量：1，单价：1,单位重量：1
		 * - 产品ID：3，数量：4，单价：11,单位重量：21
		 * 付款方式：PayPal
		 * 送货地址：Full address here
		 * 使用订单服务下此客户订单
		 */
		int orderId = 1;
		customerOrder.setOrderId(orderId);
		List<OrderItem> orderItems = new ArrayList<OrderItem>();
		orderItems.add(new OrderItem(1, 2, 3, 1));
		orderItems.add(new OrderItem(2, 1, 1, 1));
		orderItems.add(new OrderItem(3, 4, 11, 21));
		customerOrder.setOrderItems(orderItems);
		customerOrder.setPaymentMethod("PayPal");
		customerOrder.setAddress("Full address here");
		orderService.placeOrder(customerOrder);
		// 从发货单服务，根据此订单ＩＤ获取包裹后再取订单ID；如果取到的订单ID和客户订单ID相同，就说明发货成功了
		if (orderId == shippingService.getParcelByOrderId(orderId).get().getOrderId()) {
			System.out.println("Order has been processed and shipped successfully");
		}
	}

	/**
	 * 创建容器
	 * @return 返回容器
	 */
	public static Map<Class<?>, Object> createContainer() {
		// 使用ServiceLoader装载事件总线
		EventBus eventBus = ServiceLoader.load(EventBus.class).findFirst().get();

		// 使用ServiceLoader装载客户订单存储库
		CustomerOrderRepository customerOrderRepository = ServiceLoader.load(CustomerOrderRepository.class).findFirst().get();
		// 使用ServiceLoader装载发货单存储库
		ShippingOrderRepository shippingOrderRepository = ServiceLoader.load(ShippingOrderRepository.class).findFirst().get();
		// 使用ServiceLoader装载发货单服务
		ShippingService shippingService = ServiceLoader.load(ShippingService.class).findFirst().get();
		// 发货单服务设置事件总线
		shippingService.setEventBus(eventBus);
		// 发货单服务设置发货单存储库
		shippingService.setOrderRepository(shippingOrderRepository);

		// 使用ServiceLoader装载订单服务
		OrderService orderService = ServiceLoader.load(OrderService.class).findFirst().get();
		// 订单服务设置事件总线
		orderService.setEventBus(eventBus);
		// 订单服务设置客户订单存储库
		orderService.setOrderRepository(customerOrderRepository);

		// 创建一个容器
		HashMap<Class<?>, Object> container = new HashMap<>();

		// 在容器中，放入订单服务
		container.put(OrderService.class, orderService);

		// 在容器中，放入发货服务
		container.put(ShippingService.class, shippingService);

		// 返回此容器
		return container;
	}

}
